package data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dataTransferObject.Ubicacion;
import dataTransferObject.Zona;

public class JDBCUbicacionDAO implements IUbicacionDAO {

	public JDBCUbicacionDAO(){
	}
	
	public Ubicacion selectUbicacion(Connection conn, int idUbicacion) {
		Ubicacion ubicacion = null;
		PreparedStatement stat = null;
		ResultSet resultSet = null;
		Zona zona = null;
		String sql = "SELECT * FROM ubicacion JOIN zona USING (ID_ZONA) WHERE ID_UBICACION = ?";
		try{
		stat = conn.prepareStatement(sql);
		stat.setInt(1, idUbicacion);
		resultSet= stat.executeQuery();
		
		if (resultSet.next()) {
			ubicacion = new Ubicacion();
			ubicacion.setIdUbicacion(idUbicacion);
			ubicacion.setDireccion(resultSet.getString("DIRECCION"));
			ubicacion.setLatitud(resultSet.getDouble("LATITUD"));
			ubicacion.setLongitud(resultSet.getDouble("LONGITUD"));
			zona = new Zona();
			zona.setIdZona(resultSet.getInt("ID_ZONA"));
			zona.setNombre(resultSet.getString("NOMBRE"));
			ubicacion.setZona(zona);
		}
		} catch(SQLException e) { 
			System.out.println("selectUbicacion Message: " + e.getMessage());
	        System.out.println("selectUbicacion SQLState: " + e.getSQLState());
	        System.out.println("selectUbicacion ErrorCode: " + e.getErrorCode());
		} finally {
	        try {
	            if (resultSet != null)
	                resultSet.close();
	            if (stat != null)
	                stat.close();
	        } catch (SQLException e) {
	        } 
		}
	return ubicacion;
	}
	
	public int selectIdUbicacion(int idZona, String direccion) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		int idUbicacion = 0;
		PreparedStatement stat = null;
		ResultSet resultSet = null;
		String sql = "SELECT ID_UBICACION FROM ubicacion WHERE ID_ZONA = ? AND DIRECCION = ?";
		try {
		stat = conn.prepareStatement(sql);
		stat.setInt(1, idZona);
		stat.setString(2, direccion);
		resultSet= stat.executeQuery();
		
		if (resultSet.next()) {
			idUbicacion = resultSet.getInt("ID_UBICACION");
		}
		} catch(SQLException e) { 
			System.out.println("selectUbicacion Message: " + e.getMessage());
	        System.out.println("selectUbicacion SQLState: " + e.getSQLState());
	        System.out.println("selectUbicacion ErrorCode: " + e.getErrorCode());
		}finally {
			ConnectionManager.getInstance().CheckIn(conn);
	        try {
	            if (resultSet != null)
	                resultSet.close();
	            if (stat != null)
	                stat.close();
	        } catch (SQLException e) {
	        } 
		}
	return idUbicacion;
	}

	public void insertUbicacion(Ubicacion ubicacion) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		PreparedStatement stmt = null;
		String sql = "INSERT INTO ubicacion (ID_ZONA, DIRECCION, LATITUD, LONGITUD) VALUES (?, ?, ?, ?)";
		
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, ubicacion.getZona().getIdZona());
			stmt.setString(2, ubicacion.getDireccion());
			stmt.setDouble(3, ubicacion.getLatitud());
			stmt.setDouble(4, ubicacion.getLongitud());
			stmt.executeUpdate();
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
        	ConnectionManager.getInstance().CheckIn(conn);
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
	}
	
	/**
	 * Debe traer la ubicacion perteneciente a un lugar concreto
	 */
	@Override
	public Integer getUbicacionByLugar(Integer idLugar) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		Integer resultado = null;
		
		// SELECT ubicacion.ID_UBICACION FROM ubicacion,lugar WHERE
		// lugar.ID_UBICACION=ubicacion.ID_UBICACION AND lugar.ID_LUGAR=2;
		String sql = "SELECT ubicacion.ID_UBICACION FROM ubicacion,lugar WHERE lugar.ID_UBICACION=ubicacion.ID_UBICACION AND lugar.ID_LUGAR=?";
		PreparedStatement stat = null;
		ResultSet resultSet = null;
		try {
			stat = conn.prepareStatement(sql);

			stat.setInt(1, idLugar);// sustituyo la interrogacion 1

			resultSet = stat.executeQuery(); //Guardamos la query en una tabla
			
			
			while (resultSet.next()) {
				resultado = resultSet.getInt("ID_UBICACION");
			}
			

		} catch (SQLException e) {
			System.out.println("selectUbicacion Message: " + e.getMessage());
			System.out.println("selectUbicacion SQLState: " + e.getSQLState());
			System.out
					.println("selectUbicacion ErrorCode: " + e.getErrorCode());

		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
			try {
				if (resultSet != null)
					resultSet.close();
				if (stat != null)
					stat.close();
			} catch (SQLException e) {
			}
		}
		return resultado;
	}

	@Override
	public List<Ubicacion> getUbicacionesCercanas(Integer idUbicacion) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		String sql = "SELECT ID_UBICACION,ID_ZONA,DIRECCION,(LATITUD-ORIGENLA) + (LONGITUD-ORIGENLO) AS DIF FROM ubicacion" +
				",(SELECT LATITUD AS ORIGENLA,LONGITUD AS ORIGENLO FROM ubicacion WHERE ubicacion.ID_UBICACION=?)" +
				" AS TABLA2 WHERE (LATITUD-ORIGENLA) + (LONGITUD-ORIGENLO) < 0.3 AND (LATITUD-ORIGENLA) + (LONGITUD-ORIGENLO) > -0.3;";
		
        List<Ubicacion> resultadoUbicaciones=new ArrayList<Ubicacion>();
        PreparedStatement stat = null;
		ResultSet resultSet = null;
		try {
			stat = conn.prepareStatement(sql);

			stat.setInt(1, idUbicacion);// sustituyo la interrogacion 1

			resultSet = stat.executeQuery(); //Guardamos la query en una tabla
			
			
			while (resultSet.next()) {
				Ubicacion aux=new Ubicacion();
				aux.setIdUbicacion(resultSet.getInt("ID_UBICACION"));
				aux.setDireccion(resultSet.getString("DIRECCION"));
			    resultadoUbicaciones.add(aux);
			}
			

		} catch (SQLException e) {
			System.out.println("selectUbicacion Message: " + e.getMessage());
			System.out.println("selectUbicacion SQLState: " + e.getSQLState());
			System.out
					.println("selectUbicacion ErrorCode: " + e.getErrorCode());

		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
			try {
				if (resultSet != null)
					resultSet.close();
				if (stat != null)
					stat.close();
			} catch (SQLException e) {
			}
		}
		return resultadoUbicaciones;
	}
}
